package com.grupoconstruobras.sigo.integracion.personas;

import com.grupoconstruobras.sigo.data.personas.Persona;
import com.grupoconstruobras.sigo.general.enums.CRUD;
import com.grupoconstruobras.sigo.general.util.JPADataModel;
import com.grupoconstruobras.sigo.general.util.TableBean;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.richfaces.component.SortOrder;

/**
 * @author ricardo.buitrago@globant.com
 */
// @Named
// @SessionScoped
public class PersonaPopupComponent extends TableBean implements Serializable {

  private static final long serialVersionUID = 6440127427801510912L;

  @Inject
  private IPersonaManager personaManager;

  private Persona persona;

  private String crud;

  private static final class PersonaDataModel extends JPADataModel<Persona> {
    private PersonaDataModel(EntityManager em) {
      super(em, Persona.class);
    }

    @Override
    protected Object getId(Persona t) {
      return t.getId();
    }
  }

  public static enum tableFields {
    idPersona("idPersona", "idPersona"), tipoIdentificacion("tipoIdentificacion",
        "tipoIdentificacion"), numeroIdentificacion("numeroIdentificacion", "numeroIdentificacion"), nombreCompleto(
        "nombreCompleto", "nombreCompleto");

    private String labelString;
    private String valString;

    tableFields(String label, String val) {
      labelString = label;
      valString = val;
    }

    public String toString() {
      return labelString;
    }

    public String getVal() {
      return valString;
    }

  }

  @PersistenceContext(unitName="default")
  private EntityManager entityManager;

  private PersonaPopupImplementer implementerBean;

  public PersonaPopupComponent(PersonaPopupImplementer implementerBean) {
    this.implementerBean = implementerBean;
  }

  @Override
  public Object getDataModel() {
    return new PersonaDataModel(entityManager);
  }

  @PostConstruct
  public void init() {
    this.crud = null;
    this.persona = new Persona();

    this.clearAll();
  }

  public void clearAll() {

    this.persona = new Persona();

    sortOrders.put(tableFields.idPersona.toString(), SortOrder.unsorted);
    sortOrders.put(tableFields.tipoIdentificacion.toString(), SortOrder.unsorted);
    sortOrders.put(tableFields.numeroIdentificacion.toString(), SortOrder.unsorted);
    sortOrders.put(tableFields.nombreCompleto.toString(), SortOrder.unsorted);

  }

  public void consultarListaPersonas() {
    filterValues.clear();
    if (persona.getId() != null)
      filterValues.put("idPersona", persona.getId());
    else if (persona.getTipoDocumentodeidentidad() != null)
      filterValues.put("tipoIdentificacion", persona.getTipoDocumentodeidentidad());
    else if (persona.getNumeroIdentificacion() != null)
      filterValues.put("numeroIdentificacion", persona.getNumeroIdentificacion());
  }

  public Persona getPersona() {
    return persona;
  }

  public void setPersona(Persona persona) {
    this.persona = persona;
  }

  public String getCrud() {
    return crud;
  }

  public void setCrud(String crud) {
    this.crud = crud;
  }

  public boolean isRead() {
    return this.crud != null && this.crud.equals(CRUD.READ.toString());
  }

  public void consultarPersona() {
    if (isRead()) {
      // TODO add ref to PersonaFilter (ver BienManager)
      this.persona = personaManager.selectById(this.persona.getId());
    }
  }

  public void eliminarPersona() {
    // halt! are you sure? is that even legal?
  }

  public void editarPersona() {
    // TODO not implemented yet
  }

  public void onSelectPersona() {
    this.implementerBean.configurarDatosPersona(persona);
  }
}
